package org.jeecg.modules.system.controller;


import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.util.JPushClientUtil;
import org.jeecg.modules.system.entity.Notice;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.mapper.NoticeMapper;
import org.jeecg.modules.system.mapper.SysUserMapper;
import org.jeecg.modules.system.service.INoticeService;
import org.jeecg.modules.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

@Controller
@RequestMapping("/b/sys/send")
public class JPushClientController   {

@Autowired
private ISysUserService sysUserService;
@Autowired
private INoticeService noticeService;

/**
	 * 给指定目标用户推送
	 * 
	 * @param pushMap
	 * 		@see  :目标用户id 列表格式
	 * 		@see  : 推送的附加信息
	 */
    @RequestMapping("sys/sendPush")
	public void sendPush(Map<List<String>, Notice> pushMap) {
		try{
			Iterator<Entry<List<String>, Notice>> iterator =  pushMap.entrySet().iterator();
			while(iterator.hasNext()){
				Entry<List<String>, Notice> entry  = iterator.next();
				List<String> targets =  entry.getKey();
				for(int i=0; i<targets.size();i++){
					Notice linkmanNotice = entry.getValue();
					Notice newLinkmanNotice = new Notice();
					newLinkmanNotice.setTargetUser(linkmanNotice.getTargetUser());
					newLinkmanNotice.setNoticeType(linkmanNotice.getNoticeType());
					newLinkmanNotice.setNoticeContent(linkmanNotice.getNoticeContent());
					newLinkmanNotice.setNoticeParam1(linkmanNotice.getNoticeParam1());
					newLinkmanNotice.setNoticeParam2(linkmanNotice.getNoticeParam2());
					newLinkmanNotice.setNoticeParam3(linkmanNotice.getNoticeParam3());
					newLinkmanNotice.setNoticeParam4(linkmanNotice.getNoticeParam4());
					newLinkmanNotice.setNoticeParam5(linkmanNotice.getNoticeParam5());
					newLinkmanNotice.setStatus(linkmanNotice.getStatus());
					newLinkmanNotice.setField1(linkmanNotice.getField1());
					newLinkmanNotice.setField2(linkmanNotice.getField2());
					newLinkmanNotice.setField3(linkmanNotice.getField3());
					newLinkmanNotice.setField4(linkmanNotice.getField4());
					newLinkmanNotice.setField5(linkmanNotice.getField5());
					newLinkmanNotice.setField6(linkmanNotice.getField6());
					newLinkmanNotice.setField7(linkmanNotice.getField7());
					
					Map<String, String> extras = new HashMap<String, String>();
					// 推送通知的类型(公告,友情提醒，流程通知等)
					extras.put("pushType", newLinkmanNotice.getNoticeType());
					// 推送对应的具体业务的id
					extras.put("bussinessId", newLinkmanNotice.getNoticeParam1());
					// 推送对应的具体业务的状态（流程推送：0:签收 1:审批 2:重新申请 3:周知）
					// 控制判断：当前流程推送(流程推送以PD开头)时
					//				0:签收  ---  点击进入待审批列表页面
					//				1:审批  ---  点击进入该业务流程的审批详细页面（即：可进行同意和驳回页面）
					// 				2:重新申请-- 点击进入该业务流程的详细页面 可进行修改申请的内容
					//					***注意***：1和2时 需要判断当前用户是否有主次账号
					//				3:周知  ---  点击不进入任何页面 只做提示用 （如：请假了需要周知人事经理等）
					//			系统管理员分配推送(以AS开头)时
					//				0:通知 ---  点击进入消息列表界面
					// 当前为公告推送：~~~
					//
					extras.put("opertionStatus", newLinkmanNotice.getNoticeParam2());
					SysUser targetUser = sysUserService.getById(targets.get(i));
					// 当前流程发起者的所属部门id
					extras.put("officeId", newLinkmanNotice.getNoticeParam3());
					// 推送的目标用户
					newLinkmanNotice.setTargetUser(targetUser);
					// 推送的目标用户名
					newLinkmanNotice.setField2(targetUser.getRealname());
					//推送的状态 默认设置为未推送状态 (极光后台默认未推送到没有返回值 会抛异常)
					//		 未推送到   :99
					//		 推送收到了 : 0
					//		 用户点击了: 1
					newLinkmanNotice.setStatus(99);
					if(StringUtils.isNotEmpty(newLinkmanNotice.getNoticeType())){
						// 推送大分类
						newLinkmanNotice.setField3(newLinkmanNotice.getNoticeType().substring(0,2));
						extras.put("field3", newLinkmanNotice.getField3());
					} else {
						extras.put("field3", "");
					}
					noticeService.save(newLinkmanNotice);
					 //linkmanNotice表的主键id
					extras.put("noticeId", newLinkmanNotice.getId());
					if(!"JG".equals(newLinkmanNotice.getField3())){ //日志周报留言暂时不做推送
						String result = JPushClientUtil.pushMessageToUser(targets.get(i), linkmanNotice.getField1(),
								newLinkmanNotice.getNoticeContent(), extras);
						System.out.println("result："+ result);
						newLinkmanNotice.setStatus(Integer.valueOf(result)); //更新推送的状态
					} else {
						newLinkmanNotice.setStatus(0);
					}
					noticeService.save(newLinkmanNotice);
				}
			}
		}catch(Exception e){
			System.out.println("JPushClientService---推送异常");
			e.printStackTrace();
		}

	}
	
	
	
	
}
